using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    [HideInInspector]
    public Model model;

    [HideInInspector]
    public View view;

    private ShapeManager currentShape = null;//当前在游戏中的形状实例。

    private bool isPause = false;//游戏是否处于暂停状态。

    private Transform blockHolder;//所有生成shapes的父对象


    public ShapeManager[] shapes;//游戏中可用的7种形状对应的管理器。

    public Color[] colors;//游戏中可用的颜色



    private void Awake()
    {
        //ctrl = GetComponent<Ctrl>();
        model = GameObject.FindGameObjectWithTag("Model").GetComponent<Model>();
        view = GameObject.FindGameObjectWithTag("View").GetComponent<View>();
        blockHolder = GameObject.FindGameObjectWithTag("BlockHolder").transform;
    }

    /**
     * @brief  如果游戏处于暂停状态，则直接返回；如果当前没有形状，则生成一个新的形状     
     */
    void Update()
    {
        if (isPause) return;
        if (currentShape == null)
        {
            SpawnShape();
        }
    }

    /**
     * @brief 清除当前形状的方法。
     *        如果当前有形状存在，则销毁其游戏对象，并将当前形状引用置为空。
     */
    public void ClearShape()
    {
        if (currentShape != null)
        {
            Destroy(currentShape.gameObject);
            currentShape = null;
        }
    }

    /**
     * @brief 开始游戏的方法。
     *        将游戏状态设置为非暂停，并恢复当前形状（如果存在）的移动。
     */
    //public void StartGame()
    //{
    //    isPause = false;
    //    if (currentShape != null)
    //        currentShape.Resume();
    //}

    /**
     * @brief 暂停游戏的方法。
     *        将游戏状态设置为暂停，并暂停当前形状（如果存在）的移动。
     */
    //public void PauseGame()
    //{
    //    isPause = true;
    //    if (currentShape != null)
    //        currentShape.Pause();
    //}

    /**
     * @brief 生成新形状的方法。
     *        从形状和颜色数组中随机选择一个，实例化该形状，并将其父级设置为形状持有者。
     *        然后初始化形状。
     */
    void SpawnShape()
    {
        int index = Random.Range(0, shapes.Length);
        int indexColor = Random.Range(0, colors.Length);
        currentShape = GameObject.Instantiate(shapes[index]);

        currentShape.transform.parent = blockHolder;
        currentShape.Init(colors[indexColor], this);

    }

    /**
     * @brief 形状落下后的处理方法。
     *        将当前形状置为空，检查模型数据是否需要更新UI，并清理空的行。
     *        如果游戏结束，则暂停游戏并显示游戏结束界面。
     */
    public void FallDown()
    {
        currentShape = null;
        //if (ctrl.model.isDataUpdate)
        //{
        //    ctrl.view.UpdateGameUI(ctrl.model.Score, ctrl.model.HighScore);
        //}
        foreach (Transform t in blockHolder)//如果某个掉落物的block都被消除，只剩下pivot，就把这个物体消除掉
        {
            if (t.childCount <= 1)
            {
                Destroy(t.gameObject);
            }
        }
        //if (ctrl.model.IsGameOver())
        //{
        //    PauseGame();
        //    ctrl.view.ShowGameOverUI(ctrl.model.Score);
        //}
    }
}
